package com.core;

import java.util.Map;
import java.util.concurrent.BlockingDeque;

/**
 * <p>
 * Title: SetPropertyValue
 * </p>
 * <p>
 * Description: 处理数据
 * </p>
 * 
 * @author 詹金浩
 * @date 2018年11月6日
 */
public class HandleData extends Thread {
	private BlockingDeque<String> list;
	private Map<String, PortGuidance> map;

	private RegsService regsService = new RegsService();

	public HandleData(BlockingDeque<String> list, Map<String, PortGuidance> map) {
		this.list = list;
		this.map = map;
	}

	public void run() {
		String flightToward = null;
		String line = null;
		while (true) {
			try {
				line = list.take();
			} catch (InterruptedException e1) {
				e1.printStackTrace();
			}
			if ("end".equals(line)) {
				synchronized (map) {
					map.put("end", null);
					return;
				}
			}
			try {
				flightToward = regsService.getInfo("FFID", line);
				// A：进港（和出港引导无关） D：出港
				if (flightToward.endsWith("D")) {
					synchronized (map) {
						handle(line);
					}
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		} // end while(true)
	} // end run()

	
	/**
	 * <p>Title: handle</p>
	 * <p>Description: 处理数据</p>
	 * @param line
	 * @throws Exception
	 */
	private void handle(String line) throws Exception {
		// 消息类型和航班唯一标识
		String type = regsService.getType(line);
		String flid = regsService.getInfo("FLID", line);

		// 创建PortGuidance对象都在这进行，比每种类型分别处理方便
		if (!map.containsKey(flid)) {
			map.put(flid, new PortGuidance(null, null, null, null, null, null, null, "正点"));
		}
		// DFME_DLYE：航班延误消息
		// DFME_FETT：航班预计时间变更消息。（DLYE讲道理该包含在FETT里的...）
		// 如果提前的话应该还是正点，不会提前起飞，可能其他类别引导需要
		if ("DFME_DLYE".equals(type) || "DFME_FETT".equals(type)) {
			String fett = regsService.getInfo("FETT", line);
			PortGuidance guidance = map.get(flid);
			// 航班延误消息
			if ("DFME_DLYE".equals(type)) {
				guidance.setStatus("延误");
			} else { // 航班预计时间变更消息
				if (fett == null || (guidance.getFett() != null && guidance.getFett().compareTo(fett) < 0))
					guidance.setStatus("延误");
				else
					guidance.setStatus("正点");
			}
			if(fett != null && !"null".equals(fett))
				guidance.setFett(fett);
			map.put(flid, guidance);

			// DFME_CANE：航班取消消息。
			// DFOE_DFDE：动态航班删除。
			// 不直接删除，设置一个标志位，status设置为-1
		} else if ("DFME_CANE".equals(type) || "DFOE_DFDE".equals(type)) {
			
			map.remove(flid);
			// DFME_DEPE：航班本站起飞
			// DFME_FRTT：航班实际时间变更消息。飞机已经出港。
		} else if ("DFME_DEPE".equals(type) || "DFME_FRTT".equals(type)) {
			map.remove(flid);

			// DFME_CKLS：航班值机柜台动态信息更新。获得航班的办理柜台
		} else if ("DFME_CKLS".equals(type)) {
			
			String code = regsService.getInfo("CODE", line);
			PortGuidance guidance = map.get(flid);
			guidance.setCode(code);
			map.replace(flid, guidance);
			
		} else if ("DFME_DFUE".equals(type) || "DFME_AIRL".equals(type)) {
			
			String arno2 = regsService.getInfo("ARNO2", line);
			String flno = regsService.getInfo("FLNO", line);
			String fett = regsService.getInfo("FETT", line);
			String sfno = regsService.getInfo("SFNO", line);
			String arno3 = regsService.getInfo("ARNO3", line);
			PortGuidance guidance = map.get(flid);
			if (arno3 == null || "null".equals(arno3)) {
				guidance.setStopover("---");
				if (guidance.getTarget() == null || "null".equals(guidance.getTarget()))
					guidance.setTarget(arno2);
			} else {
				if (guidance.getTarget() == null || "null".equals(guidance.getTarget()))
					guidance.setTarget(arno3);
				if (guidance.getStopover() == null || "null".equals(guidance.getStopover()))
					guidance.setStopover(arno2);
			}
			guidance.setFlno(flno);
			guidance.setSfno(sfno);
			if(fett != null && !"null".equals(fett))
				guidance.setFett(fett);
			map.replace(flid, guidance);
			
		}
	}
}